home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 21
/
CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso
/
CUCD
/
Programming
/
PPCcforth
/
forth.line
< prev
next >
Wrap
Text File
|
1985-12-27
|
11KB
|
495 lines
------------------ SCREEN 0 ------------------
================================================================
|| C-CODED FIG-FORTH for UNIX* systems by ALLAN PRATT ||
|| ||
|| INCLUDES \ COMMENTS, ||
|| CASE..OF..ENDOF..ENDCASE ||
|| UNTHREAD, EDITOR ||
|| REFORTH, ||
|| "ALIAS NEW OLD" ||
|| AND OTHER NICE THINGS. ||
|| ( * UNIX is a trademark of Bell Labs ) ||
================================================================
------------------ SCREEN 1 ------------------
( UNTHREAD VERSION 2 / SCREEN 1 OF 3 )
: DOQUOTE \ AFTER (.")
34 EMIT WORDSIZE + DUP C@ OVER 1+ SWAP TYPE
34 EMIT SPACE DUP C@ + 1+ ;
: DOLIT \ AFTER LIT, BRANCHES, AND (LOOP)S
WORDSIZE + DUP @ . WORDSIZE + ;
-->
------------------ SCREEN 2 ------------------
( UNTHREAD VERSION 2 / SCREEN 2 OF 3 )
: DOWORD \ MAIN UNTHREADER
DUP @ WORDSIZE + DUP NFA ID. CASE
' LIT OF DOLIT ENDOF
' 0BRANCH OF DOLIT ENDOF
' BRANCH OF DOLIT ENDOF
' (LOOP) OF DOLIT ENDOF
' (+LOOP) OF DOLIT ENDOF
' (.") OF DOQUOTE ENDOF
' ;S OF DROP 0 ENDOF \ LEAVE 0
DUP OF WORDSIZE + ENDOF \ DEFAULT
ENDCASE ;
-->
------------------ SCREEN 3 ------------------
( UNTHREAD VERSION 2 / SCREEN 3 OF 3 )
: UNTHREAD \ USAGE: UNTHREAD WORD
[COMPILE] ' DUP CFA @
' DOWORD CFA @ <> 27 ?ERROR \ NOT THREADED
CR ." : " DUP NFA ID. SPACE
BEGIN
DOWORD
OUT @ C/L > IF CR THEN
-DUP WHILE
REPEAT ;
CR ." UNTHREAD READY"
;S
------------------ SCREEN 4 ------------------
( ERROR MESSAGES )
EMPTY STACK
ISN'T UNIQUE
FULL STACK
C-CODED figFORTH by ALLAN PRATT / APRIL 1985
------------------ SCREEN 5 ------------------
MSG # 16
MUST BE COMPILING
MUST BE EXECUTING
UNMATCHED STRUCTURES
DEFINITION NOT FINISHED
WORD IS PROTECTED BY FENCE
MUST BE LOADING
CONTEXT ISN'T CURRENT
ALIAS: NOT A COLON DEFINITION
ALIAS: CAN'T ALIAS A NULL WORD
------------------ SCREEN 6 ------------------
." LOADING EDITOR FOR VT100" CR
: CLS \ clear screen and home cursor
27 EMIT ." [2J" 27 EMIT ." [H"
;
: LOCATE \ 0 16 LOCATE positions cursor at line 16, column 0
27 EMIT 91 EMIT 1+ 1 .R 59 EMIT 1+ 1 .R 72 EMIT ;
: STANDOUT \ This can be a null word
27 EMIT ." [7m" ;
: STANDEND \ This can be a null word, too.
27 EMIT ." [m" ;
;S \ CONTINUE LOADING EDITOR
------------------ SCREEN 7 ------------------
." LOADING EDITOR FOR ADM5" CR
: CLS 26 EMIT ;
: LOCATE
27 EMIT 61 EMIT
32 + EMIT 32 + EMIT ;
: STANDOUT
27 EMIT 71 EMIT ;
: STANDEND
27 EMIT 71 EMIT ;
;S \ continue loading editor
------------------ SCREEN 8 ------------------
( Reserved for more terminals; set the name of the terminal
as a constant in screen 10 )
;S
------------------ SCREEN 9 ------------------
( Reserved for more terminals. Set the name of the terminal
as a constant in screen 10 )
;S
------------------ SCREEN 10 ------------------
( EDITOR -- SCREEN 1 OF 19 -- VARIABLES )
DECIMAL
0 VARIABLE ROW 0 VARIABLE COL
0 VARIABLE EDIT-SCR 0 VARIABLE SCREEN-IS-MODIFIED
0 VARIABLE MUST-UPDATE 0 VARIABLE LAST-KEY-STRUCK
0 VARIABLE CURSOR-IS-DIRTY
0 VARIABLE KEYMAP WORDSIZE 255 * ALLOT
KEYMAP WORDSIZE 256 * ERASE
0 VARIABLE SCR-BUFFER B/BUF B/SCR * WORDSIZE - ALLOT
( TERMINAL CONSTANTS -- VALUE IS SCREEN NUMBER TO LOAD )
6 CONSTANT VT100 7 CONSTANT ADM5
-->
------------------ SCREEN 11 ------------------
( EDITOR -- SCREEN 2 OF 19 -- SCREEN STUFF )
CR ." ENTER THE TYPE OF TERMINAL YOU ARE USING. TYPE ONE OF:"
CR ." VT100 ADM5" CR \ list the constants from scr 10
REFORTH \ this word gets & interprets one line.
LOAD \ load the right screen; VT100 = 6, ADM5 = 7
: EXIT-EDIT
0 16 LOCATE QUIT ;
: ABORT-EDIT
0 15 LOCATE MESSAGE ;
: BIND-ADDR ( C -- ADDR where binding is stored )
WORDSIZE * KEYMAP + ;
-->
------------------ SCREEN 12 ------------------
( EDITOR -- SCREEN 3 OF 19 -- I/O )
: ^EMIT ( OUTPUT W/ESC AND ^ )
DUP 127 > IF ." ESC-" 128 - THEN
DUP 32 < IF ." ^" 64 + THEN
EMIT ;
: BACK-WRAP ( DECR EDIT SCR. AND PUT CURSOR AT BOTTOM )
EDIT-SCR -- C/L 1- COL ! 15 ROW ! 1 MUST-UPDATE ! ;
: FORWARD-WRAP ( INCR EDIT SCR. AND PUT CURSOR AT TOP )
EDIT-SCR ++ 0 COL ! 0 ROW ! 1 MUST-UPDATE ! ;
: ED-KEY ( INPUT W/ESC FOR HI BIT )
KEY DUP 27 = IF DROP KEY 128 + THEN
DUP LAST-KEY-STRUCK ! ;
-->
------------------ SCREEN 13 ------------------
( EDITOR -- SCREEN 4 OF 19 -- BINDING WORDS )
: (BIND) ( CFA K -- STORES INTO KEYMAP )
BIND-ADDR !
;
: BIND-TO-KEY ( "BIND-TO-KEY NAME" ASKS FOR KEY )
[COMPILE] ' CFA
." KEY: " ED-KEY DUP ^EMIT SPACE
(BIND) ;
: DESCRIBE-KEY
." KEY: " ED-KEY DUP ^EMIT SPACE
BIND-ADDR @ -DUP IF NFA ID.
ELSE ." SELF-INSERT"
THEN SPACE ;
-->
------------------ SCREEN 14 ------------------
( EDITOR -- SCREEN 5 OF 19 -- PRIMITIVE OPS )
: PREV-LINE ROW @ IF ROW -- 1 CURSOR-IS-DIRTY !
ELSE BACK-WRAP THEN ;
: NEXT-LINE ROW @ 15 < IF ROW ++ 1 CURSOR-IS-DIRTY !
ELSE FORWARD-WRAP THEN ;
: BEGINNING-OF-LINE 0 COL ! 1 CURSOR-IS-DIRTY ! ;
: END-OF-LINE C/L 1- COL ! 1 CURSOR-IS-DIRTY ! ;
: EDIT-CR NEXT-LINE BEGINNING-OF-LINE ;
: PREV-CHAR COL @ IF COL -- 1 CURSOR-IS-DIRTY !
ELSE END-OF-LINE PREV-LINE
THEN ;
: NEXT-CHAR COL @ C/L 1- < IF COL ++ 1 CURSOR-IS-DIRTY !
ELSE EDIT-CR
THEN ;
-->
------------------ SCREEN 15 ------------------
( EDITOR -- SCREEN 6 OF 19 -- MORE LOW-LEVEL )
: THIS-CHAR
ROW @ EDIT-SCR @ (LINE) DROP COL @ + ;
: PUT-CHAR THIS-CHAR C! 1 MUST-UPDATE ! ;
: INSERT-CHAR PUT-CHAR NEXT-CHAR ;
: SELF-INSERT
LAST-KEY-STRUCK @ DUP THIS-CHAR C! EMIT
NEXT-CHAR
;
DECIMAL -->
------------------ SCREEN 16 ------------------
( EDITOR -- SCREEN 7 OF 19 -- DISPLAY STUFF )
HEX
: SHOWSCR ( N -- SHOWS SCREEN N )
CLS
0 10 LOCATE STANDOUT ." SCREEN " DUP . STANDEND
10 0 DO
0 I LOCATE
I OVER .LINE
LOOP DROP ;
: REDRAW EDIT-SCR @ SHOWSCR ;
: ?REDRAW
MUST-UPDATE @ IF REDRAW 0 MUST-UPDATE !
1 CURSOR-IS-DIRTY ! THEN ;
DECIMAL -->
------------------ SCREEN 17 ------------------
( EDITOR -- SCREEN 8 OF 19 -- EXECUTE-KEY )
: EXECUTE-KEY ( K -- EXECUTE THE KEY )
WORDSIZE * KEYMAP + @ -DUP IF
EXECUTE
ELSE
SELF-INSERT
THEN
;
: ?PLACE-CURSOR
CURSOR-IS-DIRTY @ IF
COL @ ROW @ LOCATE
0 CURSOR-IS-DIRTY !
THEN
;
-->
------------------ SCREEN 18 ------------------
( EDITOR -- SCREEN 9 OF 19 -- TOP-LEVEL )
: TOP-LEVEL
BEGIN
?REDRAW ?PLACE-CURSOR ED-KEY EXECUTE-KEY
AGAIN
;
: EDIT
EDIT-SCR ! CLS
0 ROW ! 0 COL ! 1 MUST-UPDATE !
TOP-LEVEL
;
-->
------------------ SCREEN 19 ------------------
( EDITOR -- SCREEN 10 OF 19 -- HIGH-LEVEL KEY WORDS )
: UPDATE-SCR ( BOUND TO ^U )
EDIT-SCR @ B/SCR * DUP B/SCR + SWAP DO
I BLOCK DROP UPDATE
LOOP ;
: NEXT-SCR ( ^C and ESC-C )
EDIT-SCR ++ 1 MUST-UPDATE !
;
: PREV-SCR ( ^R and ESC-R )
EDIT-SCR @ 0= IF EDIT-SCR ++ THEN
EDIT-SCR -- 1 MUST-UPDATE ! ;
-->
------------------ SCREEN 20 ------------------
( EDITOR -- SCREEN 11 OF 19 -- HIGH-LEVEL )
HEX
: TAB-KEY ( INCREMENT TO NEXT TAB STOP )
COL @ 8 + F8 AND DUP C/L < IF COL ! THEN ;
DECIMAL
: REEDIT ( RESTART EDITING )
EDIT-SCR @ EDIT ;
: ERRCONV
ERRBLK @ DUP B/SCR / SWAP B/SCR MOD DUP +
ERRIN @ C/L @ / + ;
: ERREDIT ERRCONV ROW ! EDIT-SCR ! BEGINNING-OF-LINE
1 MUST-UPDATE ! CLS TOP-LEVEL ;
-->
------------------ SCREEN 21 ------------------
( EDITOR -- SCREEN 12 OF 19 -- )
: UPDATE-AND-FLUSH
UPDATE-SCR FLUSH ;
: DEL-TO-END-OF-LINE
COL @ ROW @ EDIT-SCR @ ( SAVE THESE )
C/L COL @ DO BL INSERT-CHAR LOOP
EDIT-SCR ! ROW ! COL ! ( RESTORE SAVED VALUES )
;
-->
------------------ SCREEN 22 ------------------
( EDITOR -- SCREEN 13 OF 19 -- MORE HIGH-LEVEL )
: CLEAR-SCREEN
EDIT-SCR @ B/SCR * DUP B/SCR + SWAP DO
I BLOCK B/BUF BLANKS
LOOP
1 MUST-UPDATE !
;
: DESCRIBE-BINDINGS ( SHOWS ALL BINDINGS )
256 0 DO ( INTERESTING ONES, ANYWAY )
I BIND-ADDR @
-DUP IF CR I ^EMIT SPACE NFA ID. THEN
?TERMINAL IF LEAVE THEN
LOOP CR ;
-->
------------------ SCREEN 23 ------------------
( EDITOR -- SCREEN 14 OF 19 -- WORD MOVEMENT )
: NEXT-WORD
THIS-CHAR C@ BL = IF PREV-CHAR THEN ( BUG FIX )
BEGIN NEXT-CHAR THIS-CHAR C@ BL = UNTIL
BEGIN NEXT-CHAR THIS-CHAR C@ BL <> UNTIL ;
: PREV-WORD
BEGIN PREV-CHAR THIS-CHAR C@ BL <> UNTIL
BEGIN PREV-CHAR THIS-CHAR C@ BL = UNTIL
NEXT-CHAR ;
-->
------------------ SCREEN 24 ------------------
( EDITOR -- SCREEN 15 OF 19 -- BUFFER CONTROL )
: TO-BUFFER ( COPY FROM HERE TO BUFFER )
EDIT-SCR @ 16 0 DO
I OVER (LINE) I C/L * SCR-BUFFER + SWAP CMOVE
LOOP DROP
;
: FROM-BUFFER ( COPY FROM BUFFER TO HERE )
EDIT-SCR @ 16 0 DO
I OVER (LINE) DROP I C/L * SCR-BUFFER + SWAP C/L CMOVE
LOOP DROP 1 MUST-UPDATE !
;
-->
------------------ SCREEN 25 ------------------
( EDITOR -- SCREEN 16 OF 19 -- MORE BUFFERS )
: SCR-COPY ( SRC DEST -- COPIES A SCREEN )
EDIT-SCR @ ROT ROT ( OLD IS THIRD )
SWAP EDIT-SCR ! TO-BUFFER ( OLD IS SECOND/DEST IS FIRST )
EDIT-SCR ! FROM-BUFFER UPDATE-SCR
EDIT-SCR !
;
: QUOTE-NEXT
ED-KEY INSERT-CHAR
;
: EXECUTE-FORTH-LINE
0 17 LOCATE 27 EMIT 84 EMIT REFORTH
1 MUST-UPDATE ! TOP-LEVEL ;
-->
------------------ SCREEN 26 ------------------
( EDITOR -- SCREEN 17 OF 19 -- )
-->
------------------ SCREEN 27 ------------------
( EDITOR -- SCREEN 18 OF 19 -- INITIALIZE BINDINGS )
' PREV-LINE CFA 11 (BIND) ( ^K )
' NEXT-LINE CFA 10 (BIND) ( ^J )
' PREV-CHAR CFA 8 (BIND) ( ^H )
' NEXT-CHAR CFA 12 (BIND) ( ^L )
' NEXT-SCR CFA 3 (BIND) ( ^C )
' PREV-SCR CFA 18 (BIND) ( ^R )
' EXIT-EDIT CFA 209 (BIND) ( ESC-Q )
' EDIT-CR CFA 13 (BIND) ( ^M )
' TAB-KEY CFA 9 (BIND) ( ^I )
' UPDATE-SCR CFA 21 (BIND) ( ^U )
' NEXT-WORD CFA 6 (BIND) ( ^F )
' PREV-WORD CFA 1 (BIND) ( ^A )
' UPDATE-AND-FLUSH CFA 198 (BIND) ( ESC-F )
-->
------------------ SCREEN 28 ------------------
( EDITOR -- SCREEN 19 OF 19 -- MORE BINDINGS )
' DEL-TO-END-OF-LINE CFA 25 (BIND) ( ^Y )
' PREV-CHAR CFA 19 (BIND) ( ^S )
' PREV-LINE CFA 5 (BIND) ( ^E )
' NEXT-LINE CFA 24 (BIND) ( ^X )
' NEXT-CHAR CFA 4 (BIND) ( ^D )
' TO-BUFFER CFA 190 (BIND) ( ESC-> )
' FROM-BUFFER CFA 188 (BIND) ( ESC-< )
' NEXT-SCREEN CFA 195 (BIND) ( ESC-C )
' PREV-SCREEN CFA 210 (BIND) ( ESC-R )
' QUOTE-NEXT CFA 16 (BIND) ( ^P )
' EXECUTE-FORTH-LINE CFA 155 (BIND) ( ESC-ESC )
CR ." EDITOR READY "
;S
------------------ SCREEN 29 ------------------